package facade;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

import negocio.NegocioArticulo;
import negocio.NegocioBanco;
import negocio.NegocioComida;
import negocio.NegocioEmpleo;
import negocio.NegocioHamburgueseria;
import negocio.NegocioJugador;
import negocio.NegocioLugar;
import negocio.NegocioMercado;
import negocio.NegocioTablero;
import negocio.NegocioTiempo;
import modelo.Articulo;
import modelo.Banco;
import modelo.Comida;
import modelo.Empleo;
import modelo.Evento;
import modelo.Hamburgueseria;
import modelo.Lugar;
import modelo.Mercado;

public class Semana {
	public static void finalizarSemana(){
		// Actualizacion de precios en nueva semana
		nuevaSemana();
		
		if(NegocioJugador.cumplioMetas()){
			// Fin de juego
		}

		// Comida
		if(!NegocioJugador.comio()){
			NegocioTiempo.setearTiempoPenalidad(NegocioTablero.getTiempo());
			System.out.println("No comio");
		}
		
		else
			NegocioJugador.consumirComida();
		
		// Ropa
		if(!NegocioJugador.tieneRopa()){
			System.out.println("Estas en bolas");
		}
		
		// Hay que pagar prestamo
		if(fechaPagoPrestamo())
			System.out.println("Hay que pagar prestamo");
		
		// Evento finde
		Evento evento = eventoFinSemana();
		System.out.println(evento.getNombre());
	}
	
	public static Evento eventoFinSemana(){
		Random ran = new Random();
		Evento evento = null;
		
		if(NegocioJugador.getDinero() < 50 || ran.nextInt(11) == 0){
			evento = NegocioTablero.getEventoBuenoRandom(NegocioJugador.getDinero());
			NegocioJugador.setDinero(NegocioJugador.getDinero() + evento.getCosto());
		}
		
		else{
			evento = NegocioTablero.getEventoMaloRandom(NegocioJugador.getDinero());
			NegocioJugador.setDinero(NegocioJugador.getDinero() - evento.getCosto());
		}
		
		return evento;
	}
	
	public static void nuevaSemana(){
		ArrayList<Lugar> lugares = NegocioTablero.getLugares();
		Iterator<Lugar> it = lugares.iterator();
		
		Float inflacion = NegocioTablero.actualizarInflacion();
		
		// Para cada lugar actualizo precios
		while(it.hasNext()){
			Lugar lugar = it.next();
			
			actualizarPreciosArticulosLugar(lugar, inflacion);
			actualizarRemuneracionEmpleos(lugar, inflacion);
		}
		
		NegocioTablero.fijarPosicion(0);
	}

	public static void actualizarPreciosArticulosLugar(Lugar lugar, Float inflacion){
		if(lugar instanceof Mercado){
			ArrayList<Articulo> listaArticulos = (ArrayList<Articulo>) NegocioMercado.getArticulos((Mercado) lugar).values();
			Iterator<Articulo> it = listaArticulos.iterator();
			
			while(it.hasNext())
				NegocioArticulo.actualizarValores(it.next(), inflacion);
		}
		
		else
			if(lugar instanceof Hamburgueseria){
				ArrayList<Comida> listaComidas = NegocioHamburgueseria.getComidas((Hamburgueseria) lugar);
				Iterator<Comida> it = listaComidas.iterator();
				
				while(it.hasNext())
					NegocioComida.actualizarValores(it.next(), inflacion);
			}
	}
	
	private static void actualizarRemuneracionEmpleos(Lugar lugar, Float inflacion) {
		ArrayList<Empleo> listaEmpleos = NegocioLugar.getEmpleos(lugar);
		
		if(listaEmpleos == null)
			return;
		
		Iterator<Empleo> it = listaEmpleos.iterator();
		
		while(it.hasNext())
			NegocioEmpleo.actualizarRemuneracion(it.next(), inflacion);
	}
	
	private static Boolean fechaPagoPrestamo() {
		Banco banco = NegocioTablero.getBanco();
		
		if(NegocioTablero.fechaPagoPrestamo() && NegocioBanco.tieneDeuda(banco))
			return true;
		
		return false;
	}
}
